package Joueur;

import java.util.Vector;

import org.eclipse.jetty.websocket.WebSocket.Connection;

import Unite.Legion;

public class GroupPlayer {
	private Vector<Player> _listeJoueur;

	private int _nbPlayerMax;

	/**
	 * @author clement/maxime
	 *	Classe interne pour la gestion de l'iteration des joueurs de GroupPlayer
	 */
	public class GroupIterator {
		private int _currentId;
		
		GroupIterator() {
			_currentId = -1;
		}

		/**
		 * @return
		 */
		public Player nextTurn() {
			Player p = next();
			p.resetAP();
			p.sendAP();
			p.sendMessage("goOK");
			return p;
		}

		/**
		 * @return
		 */
		public Player next() {
			++_currentId;
			if ((_currentId) >= maxPlayer())
				_currentId = 0;
			return _listeJoueur.get(_currentId);
		}
		

		/**
		 * @return
		 */
		public boolean hasNext() {
			return _currentId < maxPlayer() - 1;
		}
	}

	/**
	 * @param nbPlayerMax
	 */
	public GroupPlayer(int nbPlayerMax) {
		_listeJoueur = new Vector<Player>();
		_nbPlayerMax = nbPlayerMax;
	}

	/**
	 * @return
	 */
	public int maxPlayer() {
		return _listeJoueur.size();
	}

	/**
	 * @return
	 */
	public Vector<Player> getPlayerList() {
		return _listeJoueur;

	}

	/**
	 * @param connection
	 * @param legions
	 * @param maxActionPoint
	 */
	public void addPlayer(Connection connection, Vector<Legion> legions,
			int maxActionPoint) {
		if (!isFull()) {
			Player p = new Player(connection, _listeJoueur.size(), legions,
					maxActionPoint);

			for (Player player : _listeJoueur)
				p.addObserver(player);

			_listeJoueur.add(p);

			for (Player player : _listeJoueur)
				if (player.getId() != p.getId())
					player.addObserver(p);
		}
	}

	/**
	 * @param p
	 */
	public void removePlayer(Player p) {
		_listeJoueur.remove(p);
	}

	/**
	 * @return
	 */
	public Player getLastPlayer() {
		return _listeJoueur.lastElement();
	}

	/**
	 * @return
	 */
	public int nbPlayerGroup() {
		return _listeJoueur.size();

	}

	/**
	 * @param ms
	 */
	public void sendAllPlayerMessage(String ms) {
		for (Player player : _listeJoueur) {
			player.sendMessage(ms);
		}
	}

	/**
	 * @param ms
	 */
	public void sendOpponentMessage(String ms) {
		/*
		 * for( Player player : _listeJoueur ) { if ( player !=
		 * _listeJoueur.elementAt(_currentId) )
		 * //_listeJoueur.elementAt(_currentId).sendOponnent( ms, player); }
		 */
	}

	/**
	 * @param nbTilesX
	 * @param nbTilesY
	 */
	public void initPlayerPosition(int nbTilesX, int nbTilesY) {
		int i = 0;
		int part = (nbTilesY * nbTilesX) / _listeJoueur.size();
		int x, y;
		for (Player p : _listeJoueur) {
			x = (part * i) + part / 2;
			y = x % nbTilesX;
			x = x / nbTilesX;
			i++;
			p.start(x, y);
		}
	}

	/**
	 * @return si la partie est pleine
	 */
	public boolean isFull() {
		return _listeJoueur.size() == _nbPlayerMax;
	}

	/**
	 * @param player
	 */
	public Player removeFromGroup(int pId) {
		Player p = null;
		for (Player cur : getPlayerList())
			if (cur.getId() == pId) {
				p = getPlayerList().elementAt(pId);
				getPlayerList().remove(pId);
			}
		return p;
	}

	/**
	 * @param currentPlayer
	 */
	public void nextTurn(int currentPlayer) {
		getPlayerList().elementAt(currentPlayer).sendMessage("goOK");
	}

	/**
	 * @return
	 */
	public GroupIterator getIterator() {
		return new GroupIterator();
	}

}
